package com.example.mdc.logback.common.utils;

import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

import java.util.List;

/**
 * @author:      liu_pc
 * Date:        2023/8/25
 * Description: Redis工具类
 * Version:     1.0
 */
@Component
public class RedisUtils {

    private final RedisTemplate<String, Object> redisTemplate;

    public RedisUtils(RedisTemplate<String, Object> redisTemplate) {
        this.redisTemplate = redisTemplate;
    }

    /**
     * 存储键值对到Redis中，并设置过期时间。
     *
     * @param key        键
     * @param value      值
     * @param expiration 过期时间（秒）
     */
    public void set(String key, Object value, long expiration) {
        redisTemplate.opsForValue().set(key, value, expiration);
    }


    /**
     * 存储键值对到Redis中，不过期
     *
     * @param key        键
     * @param value      值
     */
    public void set(String key, Object value) {
        redisTemplate.opsForValue().set(key, value);
    }

    /**
     * 根据键从Redis中获取值。
     *
     * @param key 键
     * @return 对应的值
     */
    public Object get(String key) {
        return redisTemplate.opsForValue().get(key);
    }

    /**
     * 删除Redis中的指定键。
     *
     * @param key 键
     */
    public void delete(String key) {
        redisTemplate.delete(key);
    }

    /**
     * 将值插入队列的尾部。
     *
     * @param key   键
     * @param value 值
     * @return 队列长度
     */
    public Long push(String key, Object value) {
        return redisTemplate.opsForList().rightPush(key, value);
    }

    /**
     * 从队列的头部弹出一个值。
     *
     * @param key 键
     * @return 弹出的值
     */
    public Object pop(String key) {
        return redisTemplate.opsForList().leftPop(key);
    }

    /**
     * 获取队列的长度。
     *
     * @param key 键
     * @return 队列长度
     */
    public Long queueLength(String key) {
        return redisTemplate.opsForList().size(key);
    }

    /**
     * 获取队列的指定范围的值。
     *
     * @param key   键
     * @param start 起始索引（包含）
     * @param end   结束索引（包含）
     * @return 指定范围的值列表
     */
    public List<Object> getRange(String key, long start, long end) {
        return redisTemplate.opsForList().range(key, start, end);
    }

}
